#ifndef JUGADOR_H
#define JUGADOR_H

#include <iostream>
#include <sstream>
#include <string.h>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <vector>
#include <stdio.h>
#include <map>
#include <pthread.h>
#include <time.h>
#include "../parser/parser.h"
#include "datos.h"
#include "../sockets/udpclient.h"
#include "../punto/punto.h"
#include "../threads/ThreadEnviar.h"
#include "../threads/ThreadRecibir.h" /*Hay que incluir un Thread distinto para cada thread
*El thread se programa en la funcion run por lo que tendremos más de un Thread.h */

class Jugador
{
    int numero;
    int cicloGolpeo;
    double alpha;
    double dirPorteria,distPorteria;
public:
    clock_t te,tr;
    bool veoPelota,cercaLinea;
    Jugador();
    Jugador(int argc, char *argv[]);
    Punto posicion,pos_inicial,pos_play;
    UDPclient cliente;
    ThreadEnviar enviar;
    ThreadRecibir recibir;
    Parser parser;
    Datos datos; //Aquí almacenamos nuestros dceratos
    int refereeMode;
    bool thread_flag;
    pthread_mutex_t _mutex;

    Jugador* jugador; /** Necesario para el thread */
    stringstream msg; /** Almacenamos el mensaje que vayamos a enviar desde el thread,
                        * es de tipo stringstream, el cual nos permite introducir comodamente
                        * los valores a enviar, para utilizar esta variable como string basta
                        * con llamar a "msg.str()"
                        */
    int getnumero();
    void setnumero(int Nnumero);
    double getalpha();
    void setalpha(double num);
    void mover(float pot);
    void girar(float ang); //La cambiamos porque solo se puede hacer una cosa por ciclo
    bool golpear(float pot,float dir);
    void mirar (float ang);
    void interpretar(string h);//
    bool buscarPelota();
    void seguirPelota(bool balonzonaJugador);
    void seguirPelota();
    void colocar(double x, double y);
    void comprobar_pelota(string h);
    void correr();
    void buscarIndicador(string indicador);
    void esperarInicio();
    void setPosicion(string h);
    Punto getPosicion();
    void goTo(Punto p);
    void hearReferee();
    void goTo (double x, double y);
    void posicionPorteria();
    bool distanciaJugadoresPropios(float distancia);
    bool jugadorPropioCercaBalon();
    bool distanciaJugadoresContrarios(float distancia);
    Punto posicionJugadorPropio(int dorsal);
    Punto posicionPelota();
};

float checkAngulo(float _angulo);
float checkPotencia(float _potencia);


#endif //JUGADOR_H
